package com.zb.jsp.dao.active;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.zb.jsp.common.HibernateSessionFactory;
import com.zb.jsp.pojo.active.TblActive;
import com.zb.jsp.pojo.active.TblActiveAdvert;
import com.zb.jsp.utils.PropertiesCopyUtil;
import com.zb.jsp.utils.StringUtil;
import com.zb.jsp.vo.active.ActiveVo;

public class TblActiveDao {
	Session session = null;
	Transaction tc = null;
	// 定义输入时间格式
	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

	/**
	 * 将活动数据保存到到活动表中
	 * 
	 * @param tblActive
	 *            活动信息
	 * @param String
	 *            []选择参加活动的广告id
	 */
	public void addTblActive(TblActive tblActive, String[] rightAdvertIdList) {

		try {
			session = HibernateSessionFactory.getSession();
			tc = session.beginTransaction();
			// 保存活动信息到数据库
			session.save(tblActive);

			// 取得活动ID
			int activeId = tblActive.getId();
			// 循环广告ID，把数据插入到活动广告表中
			for (int i = 0; i < rightAdvertIdList.length; i++) {
				TblActiveAdvert tblActiveAdvert = new TblActiveAdvert();
				tblActiveAdvert.setActiveId(activeId);
				tblActiveAdvert.setAdvertId(Integer
						.valueOf(rightAdvertIdList[i]));
				session.save(tblActiveAdvert);
			}
			// 事务提交
			tc.commit();
		} catch (Exception e) {
			if (tc != null) {
				tc.rollback();
			}
			e.printStackTrace();
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	/**
	 * 根据活动状态、活动开始或结束时间或活动名称查询活动信息列表
	 * 
	 * @param activeVoQry
	 *            活动状态、活动开始或结束时间或活动名称
	 * @return advertVoList查询的活动信息
	 */
	public List<ActiveVo> findActiveVoListByAdctiveVoQry(ActiveVo activeVoQry) {

		List<ActiveVo> activeVoList = null;
		try {
			// 获取一个 Session
			session = HibernateSessionFactory.getSession();
			String hql = "select new com.zb.jsp.vo.active.ActiveVo(ta.id,ta.activeName,ta.startDate,ta.endDate,ta.sponsors,tas.stateValue) from TblActive ta,TblActiveState tas where ta.state = tas.stateCode ";
			// 判断页面上是否输入了活动名的查询条件
			if (!StringUtil.isNullOrEmpty(activeVoQry.getActiveName())) {
				hql = hql + " and ta.activeName like '%"
						+ activeVoQry.getActiveName() + "%'";
			}

			// 判断开始时间是否为空
			if (activeVoQry.getStartDate() != null) {
				System.out
						.println(formatter.format(activeVoQry.getStartDate()));
				hql = hql + " and ta.startDate>='"
						+ formatter.format(activeVoQry.getStartDate()) + "'";
			}

			// 判断结束时间是否为空
			if (activeVoQry.getEndDate() != null) {
				System.out.println(formatter.format(activeVoQry.getEndDate()));
				hql = hql + " and ta.endDate<='"
						+ formatter.format(activeVoQry.getEndDate()) + "'";
			}

			// 判断状态是否为空
			if (!StringUtil.isNullOrEmpty(activeVoQry.getState())) {
				hql = hql + " and ta.state = " + activeVoQry.getState();
			}

			// 获得一个查询的query
			Query hqlQuery = session.createQuery(hql);

			// 计算从第几条记录开始取数据(（【当前是第几页】-1）*【每一页显示多少条记录】)
			int firstRow = ((activeVoQry.getCurPage() - 1) * activeVoQry
					.getNumPerPage());

			// 游标从这个点位开始取数据
			hqlQuery.setFirstResult(firstRow);
			// 每页取多少数据 10条
			hqlQuery.setMaxResults(activeVoQry.getNumPerPage());

			// 执行查询动作
			activeVoList = hqlQuery.list();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭session
			HibernateSessionFactory.closeSession();
		}
		return activeVoList;
	}

	/**
	 * 根据活动状态、活动开始或结束时间或活动名称查询活动总记录数
	 * 
	 * @param activeVoQry
	 *            活动状态、活动开始或结束时间或活动名称
	 * @return int 活动的总记录数
	 */
	public int findActiveVoCountByActiveVoQry(ActiveVo activeVoQry) {

		int activeVoCount = 0;
		try {
			// 获取一个 Session
			session = HibernateSessionFactory.getSession();
			String hql = "select count(*) from TblActive ta where 1=1";
			// 判断页面上是否输入了活动名的查询条件
			if (!StringUtil.isNullOrEmpty(activeVoQry.getActiveName())) {
				hql = hql + " and ta.activeName like '%"
						+ activeVoQry.getActiveName() + "%'";
			}

			// 判断开始时间是否为空
			if (activeVoQry.getStartDate() != null) {
				System.out
						.println(formatter.format(activeVoQry.getStartDate()));
				hql = hql + " and startDate>='"
						+ formatter.format(activeVoQry.getStartDate()) + "'";
			}

			// 判断结束时间是否为空
			if (activeVoQry.getEndDate() != null) {
				System.out.println(formatter.format(activeVoQry.getEndDate()));
				hql = hql + " and endDate<='"
						+ formatter.format(activeVoQry.getEndDate()) + "'";
			}

			// 判断状态是否为空
			if (!StringUtil.isNullOrEmpty(activeVoQry.getState())) {
				hql = hql + " and state = " + activeVoQry.getState();
			}

			// 获得一个查询的query
			Query hqlQuery = session.createQuery(hql);

			// 执行查询动作
			List activVoList = hqlQuery.list();
			activeVoCount = ((Long) activVoList.get(0)).intValue();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭session
			HibernateSessionFactory.closeSession();
		}
		return activeVoCount;
	}

	/**
	 * 根据页面获取到的id号删除数据库信息
	 * 
	 * @param ids
	 *            拼接好 的id 号
	 */
	public void delActives(String ids) {

		try {
			// 获取一个 Session连接
			session = HibernateSessionFactory.getSession();

			// 打开一个事务
			tc = session.beginTransaction();

			// 先删除活动广告表的信息ids为要删除的信息的id的拼接
			String hql = "delete from TblActiveAdvert where activeId in ("
					+ ids + ")";

			// 调用 session接口进行删除操作
			Query hqlQuery = session.createQuery(hql);

			hqlQuery.executeUpdate();

			// 再删除活动表的信息
			// ids为要删除的信息的id的拼接
			String hqlTblActive = "delete from TblActive where id in (" + ids
					+ ")";

			// 调用 session接口进行删除操作
			Query hqlQueryTblActive = session.createQuery(hqlTblActive);

			hqlQueryTblActive.executeUpdate();

			// 提交事务
			tc.commit();
		} catch (Exception e) {
			if (tc != null) {
				// 事务回滚
				tc.rollback();
			}
			e.printStackTrace();
		} finally {
			// 关闭session
			HibernateSessionFactory.closeSession();
		}
	}

	/**
	 * 根据id查询数据库信息
	 * 
	 * @param id
	 *            传入的id号
	 * @return 返回给 TblAdvert 对象
	 */
	public TblActive findTblActiveById(int id) {
		// 用来存放查询结果的pojo对象
		TblActive tblActive = null;

		try {
			// step 1 : 获取一个 Session连接
			Session session = HibernateSessionFactory.getSession();

			// step 2 :调用 session接口进行根据主键查询操作
			tblActive = (TblActive) session.get(TblActive.class, id);
		} finally {
			// step 3 : 关闭session
			HibernateSessionFactory.closeSession();
		}

		return tblActive;

	}

	/**
	 * 更新广告数据到tbl_active
	 * 
	 * @param tblAdvert
	 *            广告信息
	 */
	public void uptTblActive(TblActive tblActive, String[] rightAdvertIdList) {
		Session session = null;
		Transaction tc = null;
		try {
			// step 1 : 获取一个 Session连接
			session = HibernateSessionFactory.getSession();

			// step 2 : 打开一个事务
			tc = session.beginTransaction();

			// step 3 :调用 session接口进行更新操作
			session.update(tblActive);

			// 获取活动表id
			int activeId = tblActive.getId();
			// 根据活动表id删除活动广告表中的信息
			String delHql = "delete from TblActiveAdvert where activeId = "
					+ activeId;
			// 调用session接口对活动广告表进行删除操作
			Query hqlQueryActiveAdvert = session.createQuery(delHql);
			hqlQueryActiveAdvert.executeUpdate();

			// 将更新信息保存到活动广告表中去
			// 循环广告ID，把数据插入到活动广告表中			
			for (int i = 0; i < rightAdvertIdList.length; i++) {
				TblActiveAdvert tblActiveAdvert = new TblActiveAdvert();
				tblActiveAdvert.setActiveId(activeId);
				tblActiveAdvert.setAdvertId(Integer
						.valueOf(rightAdvertIdList[i]));
				session.save(tblActiveAdvert);
			}

			// step 4 : 提交事务
			tc.commit();
		} catch (Exception e) {
			if (tc != null) {
				// other:事务回滚
				tc.rollback();
			}
			e.printStackTrace();
		} finally {
			// step 5 : 关闭session
			HibernateSessionFactory.closeSession();
			System.out.println("活动信息修改成功");
		}
	}
}
